import requests
import subprocess
import sys

#Author：王晓政
#QQ：3415278922
#Date：2024-7-13
print(sys.argv)

#判断参数数量是否为1
#if len(sys.argv) !=1:
 #   print("请输入一个nginx日志路径！")
  #  sys.exit(1)

#获取输入的第一个值
ip_dir = sys.argv[1]

#判断文件是否存在
#if os.path.exists(ip_dir):
filelog = ip_dir
#else:
  #  print(f"{ip_addr}文件不存在！")

#指定nginx日志文件路径
#ip_dir = '/var/log/nginx/web20-access.log.1'

# 获取IP对应省市
def get_ip_location(ipa):

    # response = requests.get(f'http://ip-api.com/json/{ip}')
    response = requests.get(f'http://ip-api.com/json/{ipa}?lang=zh-CN')
    data = response.json()
    if data['status'] == 'success':
        return {
            'ip': data['query'],
            # 'country': data['country'],
            'regionName': data['regionName'],
            'city': data['city'],
            # 'zip': data['zip'],
            # 'lat': data['lat'],
            # 'lon': data['lon']
        }
    else:
        return None

# 将IP格式化
def ip_formatting(ips):
    # 创建一个空列表来存储IP地址
    ip_addresses = []

    # IP地址列表的原始文本
    ips_text = f"""
    {ips}
    """

    # 使用strip移除首尾空白字符，然后按行分割文本
    ip_lines = ips_text.strip().split('\n')

    # 遍历每一行并将其添加到列表中
    for ip in ip_lines:
        ip_addresses.append(ip)

    # 返回结果列表
    return ip_addresses

# 获取IP地址文件
def get_ipaddr(dir):
    # 执行cat命令
    cat_proc = subprocess.Popen(['cat', f'{dir}'], stdout=subprocess.PIPE)

    # 管道输出给awk命令，打印每行的第一个字段
    awk1_proc = subprocess.Popen(['awk', '{print $1}'], stdin=cat_proc.stdout, stdout=subprocess.PIPE)
    cat_proc.stdout.close()

    # 管道输出给sort命令
    sort1_proc = subprocess.Popen(['sort'], stdin=awk1_proc.stdout, stdout=subprocess.PIPE)
    awk1_proc.stdout.close()

    # 管道输出给uniq -c命令
    uniq_proc = subprocess.Popen(['uniq', '-c'], stdin=sort1_proc.stdout, stdout=subprocess.PIPE)
    sort1_proc.stdout.close()

    # 管道输出给sort -rn命令
    sort2_proc = subprocess.Popen(['sort', '-rn'], stdin=uniq_proc.stdout, stdout=subprocess.PIPE)
    uniq_proc.stdout.close()

    # 最后一次管道输出给awk命令，打印每行的第二个字段（即IP地址）
    awk2_proc = subprocess.Popen(['awk', '{print $2}'], stdin=sort2_proc.stdout, stdout=subprocess.PIPE)
    sort2_proc.stdout.close()

    # 获取最终输出
    output, _ = awk2_proc.communicate()
    source_ips = output.decode().strip()
    #将获取到的IP列数据传给格式化IP函数
    return ip_formatting(source_ips)

#具体IP值
ip = get_ipaddr(filelog)

#返回IP和所属省市信息
num = 0
for item in ip:
#接收返回的json格式数据
   location = get_ip_location(ip[num])
   #获取具体值
   ipaddr = location['ip'] #请求的IP
   sheng = location['regionName'] # 获取省份
   city = location['city'] #获取城市
   print(f'IP地址：{ipaddr} \t省份：{sheng} \t城市：{city}')
   num = num+1

